package cn.genmer.test.security.programmerTestClass.service.impl;

import cn.genmer.test.security.model.testClass.TodoIndexParameter;
import cn.genmer.test.security.model.testClass.TodoItem;
import cn.genmer.test.security.programmerTestClass.dto.TodoParameter;
import cn.genmer.test.security.programmerTestClass.repository.TodoItemRepository;
import cn.genmer.test.security.programmerTestClass.service.TodoItemService;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

public class TodoItemServiceImpl implements TodoItemService {
    private final TodoItemRepository repository;

    public TodoItemServiceImpl(final TodoItemRepository repository){
        this.repository = repository;

    }

    @Override
    public TodoItem addTodoItem(final TodoParameter todoParameter) {
        if (todoParameter == null) throw new IllegalArgumentException("参数不能为空");
        // 0. 假装存起来了
        TodoItem todoItem = new TodoItem(todoParameter.getContent());
        return repository.save(todoItem);
    }

    @Override
    public Optional<TodoItem> markTodoItemDone(final TodoIndexParameter index) {
        final Iterable<TodoItem> all = this.repository.findAll();

        final Optional<TodoItem> optionalItem = StreamSupport.stream(all.spliterator(), false)
                .filter(element -> element.getIndex() == index.getIndex())
                .findFirst();
        return optionalItem.flatMap(this::doMarkAsDone);
    }

    private Optional<TodoItem> doMarkAsDone(final TodoItem todoItem) {
        todoItem.markDone();
        return Optional.of(this.repository.save(todoItem));
    }

    public List<TodoItem> list(final boolean all) {
        return this.repository.findAll().stream().filter(item -> all || !item.isDone()).collect(Collectors.toList());
    }
}
